/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao.impl;

import dao.RedimensionarDao;
import dao.StaticsStrings;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author rafael
 */
public class RedimensionarDaoImpl implements RedimensionarDao {

    @Override
    public void redimensionarImagem(File file, File fileImgRedimensionada) {
        try {
            Image imagemOriginal = ImageIO.read(file);
            int larguraOriginal = imagemOriginal.getWidth(null);
            int alturaOriginal = imagemOriginal.getHeight(null);
            int alturaFinal;
            int larguraFinal = 0;

            if (larguraOriginal > alturaOriginal) {
                int diferenca = larguraOriginal - StaticsStrings.DIMENSAO_IMAGEM_DEFAULT;
                float porcentagemLargura = (diferenca * 100) / larguraOriginal;
                float diferencaAltura = (alturaOriginal * porcentagemLargura) / 100;
                larguraFinal = StaticsStrings.DIMENSAO_IMAGEM_DEFAULT;
                alturaFinal = (int) (alturaOriginal - diferencaAltura);
            } else {
                int diferenca = alturaOriginal - StaticsStrings.DIMENSAO_IMAGEM_DEFAULT;
                float porcentagemAltura = (diferenca * 100) / alturaOriginal;
                float diferencaLargura = (larguraFinal * porcentagemAltura) / 100;
                alturaFinal = StaticsStrings.DIMENSAO_IMAGEM_DEFAULT;
                larguraFinal = (int) (larguraOriginal - diferencaLargura);

            }
            Image imagem = imagemOriginal.getScaledInstance(larguraFinal, alturaFinal, BufferedImage.SCALE_SMOOTH);
            BufferedImage buffer = new BufferedImage(larguraFinal, alturaFinal, BufferedImage.TYPE_INT_RGB);
            buffer.createGraphics().drawImage(imagem, 0, 0, null);
            ImageIO.write(buffer, getExtension(fileImgRedimensionada), fileImgRedimensionada);
            buffer.flush();

        } catch (Exception iOException) {
            System.out.println(iOException);
        }
    }

    @Override
    public void criarMiniaturas(File file, File fileMiniatura) {
        try {
            Image imagemOriginal = ImageIO.read(file);
            int larguraOriginal = imagemOriginal.getWidth(null);
            int alturaOriginal = imagemOriginal.getHeight(null);
            int alturaFinal;
            int larguraFinal = 0;

            if (larguraOriginal > alturaOriginal) {
                int diferenca = larguraOriginal - StaticsStrings.DIMENSAO_IMAGEM_THUMBS;
                float porcentagemLargura = (diferenca * 100) / larguraOriginal;
                float diferencaAltura = (alturaOriginal * porcentagemLargura) / 100;
                larguraFinal = StaticsStrings.DIMENSAO_IMAGEM_THUMBS;
                alturaFinal = (int) (alturaOriginal - diferencaAltura);
            } else {
                int diferenca = alturaOriginal - StaticsStrings.DIMENSAO_IMAGEM_THUMBS;
                float porcentagemAltura = (diferenca * 100) / alturaOriginal;
                float diferencaLargura = (larguraFinal * porcentagemAltura) / 100;
                alturaFinal = StaticsStrings.DIMENSAO_IMAGEM_THUMBS;
                larguraFinal = (int) (larguraOriginal - diferencaLargura);

            }
            Image imagem = imagemOriginal.getScaledInstance(larguraFinal, alturaFinal, BufferedImage.SCALE_SMOOTH);
            BufferedImage buffer = new BufferedImage(larguraFinal, alturaFinal, BufferedImage.TYPE_INT_RGB);
            buffer.createGraphics().drawImage(imagem, 0, 0, null);
            ImageIO.write(buffer, getExtension(fileMiniatura), fileMiniatura);
            buffer.flush();

        } catch (Exception iOException) {
            System.out.println(iOException);
        }
    }

    @Override
    public String getExtension(File file) {
        String nomeArq = file.getName();
        String ext = nomeArq.substring(nomeArq.lastIndexOf('.') + 1);
        return ext;
    }

    @Override
    public File criarArquivoImagem(FileUploadEvent event) throws IOException {

        int read;
        Integer max = new VeiculosDaoImpl().selectMax();
        File arquivoDefault = new File(StaticsStrings.URL_IMAGEM_DEFAULT + "/" + max + ".jpeg");
        try {

            if (arquivoDefault.exists()) {
                arquivoDefault.delete();
                arquivoDefault.createNewFile();
            }
            InputStream inputStream;
            inputStream = event.getFile().getInputstream();
            OutputStream out = new FileOutputStream(arquivoDefault);
            byte[] bytes = new byte[1024];
            while ((read = inputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            inputStream.close();
            out.flush();
            out.close();
            // GrowMessages.alertMessage(arquivoDefault.getAbsolutePath(), arquivoDefault.getAbsolutePath());
        } catch (IOException e) {
            System.out.println(e);
        }
        return arquivoDefault;
    }

    @Override
    public File criarArquivoThumbs(FileUploadEvent event) throws IOException {

        int read;
        Integer max = new VeiculosDaoImpl().selectMax();
        File arquivoDefault = new File(StaticsStrings.URL_IMAGEM_THUMBS + "/" + max + "thumbs.jpeg");
        try {

            if (arquivoDefault.exists()) {
                arquivoDefault.delete();
                arquivoDefault.createNewFile();
            }

            InputStream inputStream;

            inputStream = event.getFile().getInputstream();
            OutputStream out = new FileOutputStream(arquivoDefault);
            byte[] bytes = new byte[1024];
            while ((read = inputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            inputStream.close();
            out.flush();
            out.close();
            //GrowMessages.alertMessage(arquivoDefault.getAbsolutePath(), arquivoDefault.getAbsolutePath());
        } catch (IOException e) {
            System.out.println(e);
        }

        return arquivoDefault;
    }

    @Override
    public void criarArquivoTemporario(FileUploadEvent event) throws IOException {

        int read = 0;
        Integer max = new VeiculosDaoImpl().selectMax();
        File arquivoDefault = new File(StaticsStrings.URL_IMAGEM_TEMP + "/" + "temp" + ".jpeg");
        try {

            if (arquivoDefault.exists()) {
                arquivoDefault.delete();
                arquivoDefault.createNewFile();
            }
            InputStream inputStream;
            inputStream = event.getFile().getInputstream();
            OutputStream out = new FileOutputStream(arquivoDefault);
            byte[] bytes = new byte[1024];
            while ((read = inputStream.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            inputStream.close();
            out.flush();
            out.close();
        } catch (IOException e) {
            System.out.println(e);
        }

    }

    @Override
    public void deletarArquivosImagens(int id) {
        File arquivoDefault = new File(StaticsStrings.URL_IMAGEM_DEFAULT + "/" + id + ".jpeg");
        File arquivoThumbs = new File(StaticsStrings.URL_IMAGEM_THUMBS + "/" +id + "thumbs.jpeg");

        try {
            arquivoDefault.delete();
            arquivoThumbs.delete();
        } catch (SecurityException e) {
            GrowMessages.errorMessage(e.getLocalizedMessage(), e.getLocalizedMessage());
        }
    }
}
